package com.aistar.hotel.service.impl;

import com.aistar.common.util.IdWorker;
import com.aistar.hotel.entity.Collect;
import com.aistar.hotel.entity.Hotel;
import com.aistar.hotel.mapper.HotelCollectMapper;
import com.aistar.hotel.service.HotelCollectService;
import com.aistar.hotel.service.HotelMapperService;
import com.aistar.user.entity.User;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by wubin on 2019/7/2.
 */
@Service
@Transactional
public class HotelCollectServiceImpl implements HotelCollectService {
    @Autowired
    private HotelCollectMapper hotelCollectMapper;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private IdWorker idWorker;
    @Autowired
    private HotelMapperService hotelMapperService;
    @Autowired
    private HttpServletRequest request;

    @Override
    public Boolean findByUserId(Collect collect) {

        String userid = "1";
        String flag = stringRedisTemplate.opsForValue().get(userid+"_"+collect.getHotelId());
        if(flag!=null){
            return true;
        }else {
//            去查询数据库
            List<String> userids=hotelCollectMapper.findByUserId(collect.getCollectId());
//            继续判断数据库中有没有这些用户，一个酒店可以被多个用户收藏，所以查出来的是一个用户的集合
//            下面继续判断在用户的集合中有没有当前从token中获取到的用户
            if (userids==null||userids.size()==0){
//                没有查到任何用户收藏了当前这个酒店
                return false;
            }else {
//                查询到了，但是还要判断在这些用户里有没有包含当前从token里拿到的用户
                if (userids.contains(userid)){
                    return true;
                }else {
                    return false;
                }
            }

        }
    }

    @Override
    public Boolean save(Collect collect) {

//        添加收藏的功能
//        当点击页面中收藏的按钮，调到这个方法中，将该用户保存到数据库中

        String userid="1";
        String flag = stringRedisTemplate.opsForValue().get(userid+"_"+collect.getHotelId());
        if (flag!=null){
            return false;
        }else {
            try {
                hotelCollectMapper.save(idWorker.nextId(), userid, collect.getHotelId());
                System.out.println("collect:" + collect);
//        并且将在redis中进行存储一份
                stringRedisTemplate.opsForValue().set(userid + "_" + collect.getHotelId(), "true");
            } catch (Exception e) {
                return false;
            }
        }
        return true;
    }

    @Override
    public Boolean delUser(Collect collect) {
        String userid = "1";
        String flag = stringRedisTemplate.opsForValue().get(userid+"_"+collect.getHotelId());
        if (flag==null){
            if (hotelCollectMapper.findcollectId(userid,collect.getHotelId())!=null)
            return false;
        }else {
            try {
                //当用户点击页面删除按钮的时候，将数据库里的收藏的这个字段删除
//            System.out.println(collect.getLineId());
//            根据用户名和页面的酒店的id来删除数据库里的这个字段
                hotelCollectMapper.delUser(collect.getHotelId(), userid);
                System.out.println("collect:=======");
                //同时删除redis里的收藏，
                stringRedisTemplate.delete(userid + "_" + collect.getHotelId());

            } catch (Exception e) {
                return false;
            }
        }
        return true;
    }

    @Override
    public Map<String, Object> findByUid() {
        //首先要从当前的token中获取到当前的用户的id,再根据这个id去查询对应的商品的的id，因为多对多 的关系
//        的关系，所有查询出来的是一个集合
//        Claims claims = (Claims) request.getAttribute("claims");

//        然后再通过claims来获取到token中的用户的id，用户名
//        User user =new User();
//        user.setId(claims.getId());
//        user.setUsername(claims.getSubject());

        User user =new User();
        user.setId("1");

        List<String> hotelids = hotelCollectMapper.findByUId(user.getId());
//        判断查询的结果是否为空
        if (null==hotelids||hotelids.size()==0){
            return null;
        }
//        不为空，那么就遍历这个集合，再拿出每一个酒店的id,去根据这个酒店的id去查询出这个id对应的所
//        有的酒店的信息，那么前端就能拿到酒店的所有信息，在通过vue的方式将数据渲染到页面上
        List<Hotel> list = new ArrayList<>();
        for (String hid:hotelids){
            Hotel hotel =hotelMapperService.findById(hid);
            list.add(hotel);//将查询出来的酒店对象放入到集合中
        }
        Map<String,Object> map = new HashMap<>();//再将这个用户的信息，和查询出来的酒店的信息集合放入到map集合中返回出去
         map.put("user",user);
         map.put("list",list);

        return map;
    }


}
